package ru.pb.game.avto_save;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import ru.pb.game.configs.GameServerConfig;
import ru.pb.game.network.threading.ThreadPoolManager;
import ru.pb.global.threading.RunnableTask;

/**
 * @author Felixx
 *         <p/>
 *         Смысл класса.
 *         Сервак сохраняется ток когда идет завершения/закрытия сервака...
 *         И ето не прально, при падении нифига не сохраняется:(
 *         Поетому есть таймер который вызываетм метод {@link IAutoSave#save()} к триду моно регестрировать классы имплементирующие етот интерфейс
 *         <font color="green">ВАЖНО!!!</font>
 *         Есть метод {@link IAutoSave#shutdown()} который вызывается при завершении серва...
 *         НО метод {@link IAutoSave#save()} вызывается перед етим...в етот {@link IAutoSave#shutdown()} нада совать завершения трида, etc...
 *         <p/>
 *         Кто писал сохраннения в нутри тейх же класов...отрубал бы руки...
 *         <p/>
 */
public class AutoSaveRunner extends RunnableTask
{
	private static AutoSaveRunner _instance;
	private static final Logger _log = Logger.getLogger(AutoSaveRunner.class);

	private static final int TIME_IN_MINUTES = GameServerConfig.AUTH_SAVE_SERVER_VARIABLES * 60 * 1000;

	private boolean _shutdown;
	private final List<IAutoSave> _saveList = new ArrayList<IAutoSave>();

	public static AutoSaveRunner getInstance()
	{
		if(_instance == null)
			_instance = new AutoSaveRunner();
		return _instance;
	}

	private AutoSaveRunner()
	{
		//
	}

	public void start()
	{
		ThreadPoolManager.getInstance().scheduleAtFixedRate(this, TIME_IN_MINUTES, TIME_IN_MINUTES);
	}

	@Override
	public void runImpl()
	{
		if( !_shutdown)
			runSave();
	}

	public void add(IAutoSave task)
	{
		_saveList.add(task);
	}

	public synchronized void runSave()
	{
		for(IAutoSave $ : _saveList)
		{
			try
			{
				$.save();
			}
			catch(Exception e)
			{
				_log.info("Exception: " + e, e);
			}
		}
	}

	public void shutdown()
	{
		_shutdown = true;

		for(IAutoSave s : _saveList)
		{
			try
			{
				s.save();
				s.shutdown();
			}
			catch(Exception e)
			{
				_log.info("Exception: " + e, e);
			}
		}
	}
}